/**
 * 
 */
package diagrama;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.TreeSet;

/**
 * @author Marcos, Ricardo e Roberto
 *
 */
public class Escola implements Serializable{
	private static final long serialVersionUID = 1L;
	/**
	 * representa o nome da instituição
	 */
	private String nome;
	TreeSet Taluno;
	TreeSet Tcurso;
	TreeSet Tprofe;
	TreeSet Tturma;
	TreeSet Tescol;
	/**
	 * construtor sem paramentros para instanciar uma escola
	 */
	public Escola(){
		
	}	
	/**
	 * construtor que recebe o nome da escola para instacia-la 
	 * @param nome
	 */
	public Escola (String nome){
		this.nome = nome;
	}
	/**
	 * metodo para cadastrar aluno recebendo um ojbeto aluno
	 * @param a
	 * @return
	 */
	
	public boolean cadastrarAluno(Aluno a) {
		if (Taluno.add(a)){
			try {
				escreverNoBancoDeDados(Taluno, "aluno.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return true; // adicionando um novo objeto na árvore
		}
		return false;
	}
	
	/**
	 * metodo para pesquisar um aluno recebendo o um objeto aluno e retornando sim ou nao
	 * @param a
	 * @return
	 */
	public boolean pesquisarAluno(Aluno a) {
		try {
			Taluno = lerNoBancoDeDados("aluno.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean contem;
			contem = Taluno.contains(a);
		return contem;
	}

	/**
	 * metodo para listar os alunos retornando a arvore de alunos
	 * @return
	 */
	public TreeSet listarAluno() {		
		try {
			Tcurso = lerNoBancoDeDados("aluno.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Taluno;
	}

	/** 
	 * metodo para remover aluno 
	 * @param a
	 * @return
	 */
	public boolean removerAluno(Aluno a){
		try {
			Tcurso = lerNoBancoDeDados("aluno.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean remove = Taluno.remove(a); // remove o curso na árvore 
		try {
			escreverNoBancoDeDados(Taluno, "aluno.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return remove;
	}
	
	/**
	 * metodo para cadastrar professor
	 * @param p
	 * @return
	 */
	public boolean cadastrarProfessor(Professor p) {
		if (Tprofe.add(p)){
			try {
				escreverNoBancoDeDados(Tprofe, "profe.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return true; // adicionando um novo objeto na árvore
		}
		return false;			
	}
	
	/**
	 * metodo para pesquisar professor
	 * @param p
	 * @return
	 */
	public boolean pesquisarProfessor(Professor p) {
		try {
			Tprofe = lerNoBancoDeDados("profe.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean contem;
			contem = Tprofe.contains(p);
		return contem;
	}

	/**
	 * metodo para listar professores
	 * @return
	 */
	public TreeSet listarProfessor() {		
		try {
			Tprofe = lerNoBancoDeDados("profe.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Tprofe;
		}

	/**
	 * metodo para remover professor
	 * @param p
	 * @return
	 */
	public boolean removerProfessor(Professor p){
		try {
			Tprofe = lerNoBancoDeDados("profe.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean remove = Tprofe.remove(p); // remove o curso na árvore 
		try {
			escreverNoBancoDeDados(Tprofe, "profe.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return remove;
	}

	//-------------------Métodos para manipular Turma e curso---------------------------------------------
	/**
	 * metodo para cadastrar cursos
	 */
	public boolean cadastrarCurso(Curso o){
		if (Tcurso.add(o)){
			try {
				escreverNoBancoDeDados(Tcurso, "curso.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return true; // adicionando um novo objeto na árvore
		}
		return false;		
	}
	
	/**
	 * metodo para pesquisar cursos
	 * @param o
	 * @return
	 */
	public boolean pesquisarCurso(Curso o){
		try {
			Tcurso = lerNoBancoDeDados("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean contem;
			contem = Tcurso.contains(o);
		return contem;
	}
	
	/**
	 * metodo para listar os cursos
	 * @return
	 */
	public TreeSet listarCurso(){
		try {
			Tcurso = lerNoBancoDeDados("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Tcurso;
	}
	
	/**
	 * metodo para remover curso
	 * @param o
	 * @return
	 */
	public boolean removerCurso(Escola o){		
		try {
			Tcurso = lerNoBancoDeDados("curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		boolean remove = Tcurso.remove(o); // remove o curso na árvore 
		try {
			escreverNoBancoDeDados(Tcurso, "curso.dat");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return remove;
	}
	
	public Curso pegarCurso(Curso c){
		return (Curso)Tcurso.ceiling(c);
	}
		
	/**
	 * metodo para cadastrar turmas
	 * @param t
	 * @return
	 */
		public boolean cadastrarTurma(Turma t){
			if (Tturma.add(t)){
				try {
					escreverNoBancoDeDados(Tturma, "turma.dat");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return true; // adicionando um novo objeto na árvore
			}
			return false;		
		}
		
		/**
		 * metodo para pesquisar turma
		 * @param t
		 * @return
		 */
		public boolean pesquisarTurma(Turma t){
			try {
				Tturma = lerNoBancoDeDados("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean contem= false;
				contem = Tturma.contains(t);
			return contem;
		}
		
		/**
		 * metodo para listar turmas
		 * @return
		 */
		public TreeSet listarTurma(){
			try {
				Tturma = lerNoBancoDeDados("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return Tturma;
		}
		
		/**
		 * metodo para remover turma
		 * @param t
		 * @return
		 */
		public boolean removerTurma(Turma t){		
			try {
				Tturma = lerNoBancoDeDados("turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			boolean remove = Tturma.remove(t); // remove o curso na árvore 
			try {
				escreverNoBancoDeDados(Tturma, "turma.dat");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return remove;
		}
	
	// ------------------Métodos para ler e escrever no banco de dados----------------------------------------------
	/**
	 * metodo que recebe o nome do arquivo e ler o seu conteudo 
	 */
	public TreeSet lerNoBancoDeDados(String nomeArquivo) throws IOException, ClassNotFoundException{
		TreeSet arvore;// = new TreeSet(); // criação de uma coleção que guardará todos os alunos
		FileInputStream fis = new FileInputStream(nomeArquivo); //leitura do arquivo contendo os alunos já adicionados
		ObjectInputStream objRead = new ObjectInputStream(fis);				
		arvore = (TreeSet)objRead.readObject(); 
		objRead.close();
		return arvore;
	}
	
	/**
	 * metodo que recebe uma arvore e o nome de um arquivo para gravar a arvore no arquivo
	 * @param ts - arvore com os dados a serem gravados
	 * @param nomeArquivo - nome do arquivo a ser gravado
	 * @throws IOException
	 */
	public void escreverNoBancoDeDados(TreeSet ts, String nomeArquivo) throws IOException{
		FileOutputStream fos = new FileOutputStream(nomeArquivo);
		ObjectOutputStream objWrite = new ObjectOutputStream(fos);
		objWrite.writeObject(ts); //gravando as auterações no arquivo
		objWrite.close();
	}


	/**
	 * @param nomeEscola the nomeEscola to set
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * @return the nomeEscola
	 */
	public String getNome() {
		return nome;
	}
}



